import pandas as pd
import datetime
import re


class Transform:
    """Excel处理类"""

    def __init__(self):
        # 读取 Excel 文件内容，跳过前三行
        self.data = pd.read_excel(
            'bug_list.xlsx', skiprows=3, keep_default_na=False)
        # 删除最后一行
        self.data = self.data.iloc[:-1]
        # 合并第 1、2 列为一个“标题”字段，中间用 “-” 分隔
        self.data['标题'] = self.data['关键字'] + '-' + self.data['概要']

    def combine(self, row):
        # 将各列的值依次合并，以换行符分隔
        desc = '描述：{}\n'.format(row['描述'])
        priority = '\n优先级：{}\n'.format(row['优先级'])
        label = '\n标签：{}\n'.format(row['标签'])
        created_date = '\n创建日期：{}\n'.format(row['创建日期'])
        created_by = '\n创建者：{}\n'.format(row['创建者'])
        env_pinnacle = '\nEnvironment found in：{}\n'.format(
            row['Environment found in'])
        fix_version = '\n修复的版本：{}\n'.format(row['修复的版本'])
        issue_link = '\n问题链接：{}\n'.format(row['链接的问题'])
        control_story_id = '\n关联的需求：{}\n'.format(row['Control Story ID'])

        # 根据标签字段，设置迭代、处理人、测试人员、创建人字段
        for index, row in self.data.iterrows():
            # wpb 银行迭代
            if 'WPB-SCRM-R34-UAT-defect' in str(row['标签']) or 'WPB-R33-SIT-Defects' in str(
                    row['标签']) or 'WPB-SCRM-R34-SIT-defect' in str(row['标签']) or 'WPB-SCRM-R33-CR-defect' in str(row['标签']):
                self.data.at[index, '迭代'] = 'release-wpb-0.9.7.r34.1013'
                self.data.at[index, '处理人'] = '何永康'
                self.data.at[index, '测试人员'] = '鄢红伟'
                self.data.at[index, '创建人'] = '鄢红伟'
            elif 'WPB-SCRM-R34-UAT-defect' in str(row['标签']) or 'WPB-R34-SIT-Defects' in str(
                    row['标签']) or 'WPB-SCRM-R34-SIT-defect' in str(row['标签']):
                self.data.at[index, '迭代'] = 'release-wpb-0.9.7.r34.1013'
                self.data.at[index, '处理人'] = '何永康'
                self.data.at[index, '测试人员'] = '鄢红伟'
                self.data.at[index, '创建人'] = '鄢红伟'

            # pinnacle 金科迭代
            elif 'R34-SIT-Defects' in str(row['标签']) or 'R34.0-UAT-DEFECTS' or 'R34-CR-Defect' in str(row['标签']):
                self.data.at[index, '迭代'] = 'release-hsbc-0.9.7.r34.1013'
                self.data.at[index, '处理人'] = '方浩涛'
                self.data.at[index, '测试人员'] = '鄢红伟'
                self.data.at[index, '创建人'] = '鄢红伟'
            elif 'R33-SIT-Defects' in str(row['标签']) or 'R33.0-UAT-DEFECTS' in str(row['标签']):
                self.data.at[index, '迭代'] = 'release-hsbc-0.9.7.r33.0915'
                self.data.at[index, '处理人'] = '方浩涛'
                self.data.at[index, '测试人员'] = '赵朋'
                self.data.at[index, '创建人'] = '赵朋'

            # 其它情况设置为空
            else:
                self.data.at[index, '迭代'] = ''
                self.data.at[index, '处理人'] = ''
                self.data.at[index, '测试人员'] = ''
                self.data.at[index, '创建人'] = ''

            # 根据优先级设置值
            priority = str(row['优先级'])
            if '紧急' in priority:
                self.data.at[index, '优先级'] = '紧急'
            elif '严重' in priority:
                self.data.at[index, '优先级'] = '紧急'
            elif 'High' in priority:
                self.data.at[index, '优先级'] = '高'
            elif 'Medium' in priority:
                self.data.at[index, '优先级'] = '中'
            elif 'Low' in priority:
                self.data.at[index, '优先级'] = '低'

            # pinnacle发现环境
            pinnacle_env = str(row['Environment found in'])
            # wpb发现环境
            wpb_env = str(row['环境'])
            # 判断环境
            if 'SIT' in pinnacle_env or 'SIT' in wpb_env or 'sit' in wpb_env:
                self.data.at[index, '发现环境'] = 'SIT'
            elif 'UAT' in pinnacle_env or 'UAT' in wpb_env or 'uat' in wpb_env:
                self.data.at[index, '发现环境'] = 'UAT'
            elif 'DEV' in pinnacle_env or 'DEV' in wpb_env or 'dev' in wpb_env:
                self.data.at[index, '发现环境'] = 'DEV'
            else:
                self.data.at[index, '发现环境'] = ''

            # 原始字符串日期
            str_date = row['创建日期']
            # 格式化为指定日期字符串格式
            date_time = Date_time()
            self.data.at[index, 'Jira创建时间'] = Date_time().date_time(str_date)

        # 将所有段落拼接起来
        merged = '{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n'.format(desc, priority, label, created_date, created_by,
                                                               env_pinnacle, fix_version, issue_link,
                                                               control_story_id)

        return merged

    def output(self):
        # 在原表格中新增“详细描述”这一列，并调用上面的函数进行合并
        self.data['详细描述'] = self.data.apply(self.combine, axis=1)
        today = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")
        self.data.drop(
            columns=['描述', '标签', '创建日期', '创建者', '修复的版本',
                     'Environment found in', '链接的问题', 'Control Story ID'],
            inplace=True)

        # 调整列顺序
        self.data = self.data[['标题', '详细描述', '迭代', '处理人',
                               '测试人员', 'Jira创建时间', '创建人', '优先级', '发现环境']]
        self.data.to_excel(f"bug_{today}.xlsx", index=False)


class Date_time:
    """时间处理类"""

    # 日期格式转换
    # '20/四月/23 10:12 上午' 转换为 '23/四月/20 10:12 上午'
    def transform_date(self, date_time):
        date_str = date_time

        # 使用正则表达式匹配日期字符串中的年、月、日
        match = re.match(
            r'(\d{2})/([\u4e00-\u9fa5]{2,3})/(\d{2}) (\d{1,2}:\d{2}) ([上下]午)', date_str)

        if match:
            year = match.group(3)
            month = match.group(2)  # 月份和日份需要交换位置
            day = match.group(1)
            time = match.group(4)
            am_pm = match.group(5)

            # 拼接新的日期字符串
            new_date_str = f'{year}/{month}/{day} {time} {am_pm}'
            # print(new_date_str)
            return new_date_str
        else:
            print('日期格式不正确')
            return None

    def date_time(self, date_time_string):
        # 原始日期时间字符串（中文月份）
        # date_str = '20/四月/23 10:12 上午'
        # print('原始值：',date_time_string)
        date_str = self.transform_date(date_time_string)
        # 将中文月份转换为数字月份
        zh_month_map = {
            '一月': '01',
            '二月': '02',
            '三月': '03',
            '四月': '04',
            '五月': '05',
            '六月': '06',
            '七月': '07',
            '八月': '08',
            '九月': '09',
            '十月': '10',
            '十一月': '11',
            '十二月': '12'
        }
        for zh_month, digit_month in zh_month_map.items():
            date_str = date_str.replace(zh_month, digit_month)

        # 将 "上午" 和 "下午" 替换为 AM 和 PM
        date_str = date_str.replace('上午', 'AM')
        date_str = date_str.replace('下午', 'PM')

        # 解析字符串为 datetime 类型
        dt = datetime.datetime.strptime(date_str, '%y/%m/%d %I:%M %p')

        # 将 datetime 类型格式化为指定格式的字符串
        formatted_str = dt.strftime('%Y-%m-%d %H:%M:%S')
        # print('转换后：',formatted_str)
        return formatted_str  # 返回日期时间字符串


if __name__ == '__main__':
    Transform().output()
